package hot

/**
原题链接:
https://leetcode.cn/problems/diameter-of-binary-tree/

b站 书森学院
543.二叉树的直径
给你一棵二叉树的根节点，返回该树的直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。

示例 1：
输入：root = [1,2,3,4,5]
输出：3
解释：3 ，取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2:
输入：root = [1,2]
输出：1
*/

func diameterOfBinaryTree(root *TreeNode) int {
	if root == nil { //1.如果根节点为nil, 直接返回0即可
		return 0
	}
	maxLength := 0          //2.声明最大直径
	Depth(root, &maxLength) //3.调用最大直径方法

	return maxLength
}

// Depth 最大直径
func Depth(root *TreeNode, maxLength *int) int {
	if root == nil {
		return 0
	}

	l := Depth(root.Left, maxLength)
	r := Depth(root.Right, maxLength)
	*maxLength = Max(l+r, *maxLength)

	return Max(l, r) + 1
}

// Max 获取连个数字中较大者
func Max(a, b int) int {
	if a >= b {
		return a
	} else {
		return b
	}
}
